// http配置,引入axios以及element ui中的message组件
import axios from 'axios'
import { Message } from 'element-ui'
import store from '../store'
import { getToken, setToken, setReToken, removeToken, getReToken, tokenString } from '@/utils/auth'
import { refreshToken } from '@/api/login'

// 创建axios实例
const service = axios.create({
  // baseURL: process.env.BASE_API, // api的base_url
  timeout: 30000 // 请求超时时间
})

// request拦截器
service.interceptors.request.use(config => { // 请求
  if (config.notUserToken) {
    return config
  }
  if (store.getters.token) { // 判断是否存在token，如果存在的话，则每个http header都加上token
    config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带token--['X-Token']为自定义key 请根据实际情况自行修改
  }
  return config
}, error => {
  // Do something with request error
  Promise.reject(error)
})

// respone拦截器
service.interceptors.response.use( // 响应
  response => {
    const res = response.data
    if (res.code === 1) { // 判断code状态
      message(res.msg, 'error')
      return Promise.reject(res)
    }
    return response
  },
  error => {
    const res = error.response
    console.log('token数据', res)
    if (res.status === 401) { // 401且不是退出方法 下刷新token refreshtoken
      console.error('token超时，刷新token')
      return refreshToken()
        .then(function(response) {
          const data = response.data
          setToken(data.access_token)
          setReToken(data.refresh_token)
          store.commit('SET_TOKEN', data.access_token)// 更改SET_TOKEN
          store.commit('SET_REFRESH_TOKEN', data.refresh_token)// 更改SET_REFRESH_TOKEN
          // 发送消息--传递token
          window.parent.postMessage(tokenString(), '*')
          error.response.config.__isRetryRequest = true
          error.response.config.headers.Authorization = 'Bearer ' + data.access_token
          return axios(error.response.config)
        })
        .catch(function() {
          console.log('Refresh login error: ', error)
          // refresh_token过期 直接退出
          store.commit('SET_TOKEN', '')
          store.commit('SET_REFRESH_TOKEN', '')
          store.commit('SET_ROLES', [])
          removeToken()
          // 发送消息--退出
          window.parent.postMessage('logout', '*')
          top.location = 'http://192.168.0.58:9527/#/login'
          throw error
        })
    // this.$router.push({path:'/login'})
    } else if (res.status === 478 || res.status === 403) {
      message(res.status + '： ' + res.data.msg, 'error')
    } else if (res.status === 400) {
      message(res.status + '： ' + res.data.error_description, 'error')
    } else if (res.status === 202) { // 三方未绑定
      this.$router.push({ path: '/' })
    } else if (res.status === 503) { // 服务异常
      message(res.status + '： ' + res.data, 'error')
    } else {
      message(res.status + '： ' + res.data.message, 'error')
    }
    return Promise.reject(error)
  }
)
export function message(text, type) {
  Message({
    message: text,
    type: type,
    duration: 5 * 1000
  })
}
export default service
